#ifndef _WX_IPCBASEH__
#define _WX_IPCBASEH__

#include "wx/defs.h"
#include "wx/object.h"
#include "wx/string.h"

enum wxIPCFormat {
  wxIPC_INVALID = 0,
  wxIPC_TEXT = 1,  /* CF_TEXT */
  wxIPC_BITMAP = 2,  /* CF_BITMAP */
  wxIPC_METAFILE = 3,  /* CF_METAFILEPICT */
  wxIPC_SYLK = 4,
  wxIPC_DIF = 5,
  wxIPC_TIFF = 6,
  wxIPC_OEMTEXT = 7,  /* CF_OEMTEXT */
  wxIPC_DIB = 8,  /* CF_DIB */
  wxIPC_PALETTE = 9,
  wxIPC_PENDATA = 10,
  wxIPC_RIFF = 11,
  wxIPC_WAVE = 12,
  wxIPC_UNICODETEXT = 13,
  wxIPC_ENHMETAFILE = 14,
  wxIPC_FILENAME = 15, /* CF_HDROP */
  wxIPC_LOCALE = 16,
  wxIPC_PRIVATE = 20
};

class wxServerBase;
class wxClientBase;

class wxConnectionBase: public wxObject {
    DECLARE_CLASS( wxConnectionBase )
  public:
    wxConnectionBase( wxChar *buffer, int size ); // use external buffer
    wxConnectionBase(); // use internal, adaptive buffer
    wxConnectionBase( const wxConnectionBase& copy );
    virtual ~wxConnectionBase( void );
    void SetConnected( bool c ) { m_connected = c; }
    bool GetConnected() { return m_connected; }
    virtual bool Execute( const wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT ) = 0;
    virtual bool Execute( const wxString& str ) { return Execute( str, -1, wxIPC_TEXT ); }
    virtual wxChar *Request( const wxString& item, int *size = ( int * ) NULL, wxIPCFormat format = wxIPC_TEXT ) = 0;
    virtual bool Poke( const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT ) = 0;
    virtual bool StartAdvise( const wxString& item ) = 0;
    virtual bool StopAdvise( const wxString& item ) = 0;
    virtual bool Advise( const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT ) = 0;
    virtual bool Disconnect( void ) = 0;
    virtual bool OnExecute( const wxString& topic, wxChar *data, int size, wxIPCFormat format ) { return false; }
    virtual wxChar *OnRequest( const wxString& topic, const wxString& item, int *size, wxIPCFormat format ) {
      return ( wxChar * ) NULL;
    }
    virtual bool OnPoke( const wxString & topic, const wxString& item, wxChar *data, int size, wxIPCFormat( format ) ) {
      return false;
    }
    virtual bool OnStartAdvise( const wxString & ( topic ), const wxString & ( item ) ) { return false; }
    virtual bool OnStopAdvise( const wxString & ( topic ), const wxString & ( item ) ) { return false; }
    virtual bool OnAdvise( const wxString &topic, const wxString &item, wxChar *data, int size, wxIPCFormat format ) {
      return false;
    }
    virtual bool OnDisconnect( void ) = 0;
    wxChar * GetBufferAtLeast( size_t bytes );

  protected:
    bool m_connected;
  private:
    wxChar * m_buffer;
    size_t m_buffersize;
    bool m_deletebufferwhendone;
    wxConnectionBase& operator=( const wxConnectionBase& );
};

class wxServerBase: public wxObject {
    DECLARE_CLASS( wxServerBase )
  public:
    inline wxServerBase( void ) {}
    inline ~wxServerBase( void ) {}
    virtual bool Create( const wxString& serverName ) = 0;
    virtual wxConnectionBase *OnAcceptConnection( const wxString& topic ) = 0;
};

class wxClientBase: public wxObject {
    DECLARE_CLASS( wxClientBase )

  public:
    inline wxClientBase( void ) {}
    inline ~wxClientBase( void ) {}
    virtual bool ValidHost( const wxString& host ) = 0;
    virtual wxConnectionBase *MakeConnection( const wxString& host,const wxString& server,const wxString& topic ) = 0;
    virtual wxConnectionBase *OnMakeConnection( void ) = 0;
};

#endif
